import { login, users } from '@/api/user'
import {
  getToken,
  setToken,
  removeToken,
  setTimeStamp
} from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: ''
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
    // 2.修改缓存的token
    setToken(token)
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  }
}

const actions = {
  async login(context, datas) {
    // 经过响应拦截器的处理之后 这里的result实际上就是 token
    const { data } = await login(datas) // 实际上就是一个promise  result就是执行的结果
    // axios默认给数据加了一层data
    // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
    // 现在有用户token
    // actions 修改state 必须通过mutations
    console.log(data)
    context.commit('SET_TOKEN', data.data.token) // 设置token
    // 拿到token 说明登录成功
    setTimeStamp() // 设置当前的时间戳
  },

  // 登出操作
  logout(context) {
    // 删除token
    removeToken()
    // context.commit('removeToken')
    // 删除用户资料
    // context.commit('removeUserInfo')
    context.commit('RESET_STATE')
    // 重置路由
    resetRouter()
  },

  async users(context) {
    const result = await users() // 获取返回值
    console.log(result)
    context.commit('setUserInfo', result) // 将整个的个人信息设置到用户的vuex数据中
    return result // 这里为什么要返回 为后面埋下伏笔
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

